/* * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Gagnavarslan ehf */ package org.nuxeo.ecm.webdav.resource; import static javax.ws.rs.core.Response.Status.OK; import static net.java.dev.webdav.jaxrs.xml.properties.ResourceType.COLLECTION; import java.net.URI; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HEAD; import javax.ws.rs.HeaderParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import net.java.dev.webdav.jaxrs.methods.COPY; import net.java.dev.webdav.jaxrs.methods.LOCK; import net.java.dev.webdav.jaxrs.methods.MKCOL; import net.java.dev.webdav.jaxrs.methods.MOVE; import net.java.dev.webdav.jaxrs.methods.PROPFIND; import net.java.dev.webdav.jaxrs.methods.PROPPATCH; import net.java.dev.webdav.jaxrs.methods.UNLOCK; import net.java.dev.webdav.jaxrs.xml.elements.ActiveLock; import net.java.dev.webdav.jaxrs.xml.elements.Depth; import net.java.dev.webdav.jaxrs.xml.elements.HRef; import net.java.dev.webdav.jaxrs.xml.elements.LockRoot; import net.java.dev.webdav.jaxrs.xml.elements.LockScope; import net.java.dev.webdav.jaxrs.xml.elements.LockToken; import net.java.dev.webdav.jaxrs.xml.elements.LockType; import net.java.dev.webdav.jaxrs.xml.elements.MultiStatus; import net.java.dev.webdav.jaxrs.xml.elements.Owner; import net.java.dev.webdav.jaxrs.xml.elements.Prop; import net.java.dev.webdav.jaxrs.xml.elements.PropStat; import net.java.dev.webdav.jaxrs.xml.elements.Status; import net.java.dev.webdav.jaxrs.xml.elements.TimeOut; import net.java.dev.webdav.jaxrs.xml.properties.CreationDate; import net.java.dev.webdav.jaxrs.xml.properties.DisplayName; import net.java.dev.webdav.jaxrs.xml.properties.GetContentLength; import net.java.dev.webdav.jaxrs.xml.properties.GetContentType; import net.java.dev.webdav.jaxrs.xml.properties.GetLastModified; import net.java.dev.webdav.jaxrs.xml.properties.LockDiscovery; import net.java.dev.webdav.jaxrs.xml.properties.SupportedLock; import org.apache.commons.lang.StringEscapeUtils; import org.nuxeo.ecm.webdav.jaxrs.IsCollection; import org.nuxeo.ecm.webdav.jaxrs.IsFolder; import org.nuxeo.ecm.webdav.jaxrs.IsHidden; public class VirtualFolderResource extends AbstractResource { private LinkedList<String> rootFolderNames; public VirtualFolderResource(String path, HttpServletRequest request, LinkedList<String> rootFolderNames) { super(path, request); this.rootFolderNames = rootFolderNames; } @GET @Produces("text/html") public String get() { StringBuilder sb = new StringBuilder(); sb.append("<html><body><p>"); sb.append("Folder listing for "); sb.append(path); sb.append("/"); sb.append("</p>\n<ul>\n"); for (String name : rootFolderNames) { String qname = StringEscapeUtils.escapeHtml(name); sb.append("<li><a href=\""); sb.append(qname); sb.append("/"); // terminating slash sb.append("\">"); sb.append(qname); sb.append("</a></li>\n"); } sb.append("</ul></body>\n"); return sb.toString(); } @PROPFIND public Response propfind(@Context UriInfo uriInfo, @HeaderParam("depth") String depth) { if (depth == null) { depth = "1"; } Date lastModified = new Date(); Date creationDate = new Date(); @SuppressWarnings("deprecation") final net.java.dev.webdav.jaxrs.xml.elements.Response response = new net.java.dev.webdav.jaxrs.xml.elements.Response( new HRef(uriInfo.getRequestUri()), null, null, null, new PropStat(new Prop(new DisplayName("nuxeo"), /* * @ * TODO * : * fix * this * . * Hardcoded * root * name */ new LockDiscovery(), new SupportedLock(), new IsFolder("t"), new IsCollection(Integer.valueOf(1)), new IsHidden(Integer.valueOf(0)), new GetContentType("application/octet-stream"), new GetContentLength(0), new CreationDate(creationDate), new GetLastModified(lastModified), COLLECTION), new Status(OK))); if (depth.equals("0")) { return Response.status(207).entity(new MultiStatus(response)).build(); } List<net.java.dev.webdav.jaxrs.xml.elements.Response> responses = new ArrayList<net.java.dev.webdav.jaxrs.xml.elements.Response>(); responses.add(response); for (String name : rootFolderNames) { lastModified = new Date(); creationDate = new Date(); PropStatBuilderExt props = new PropStatBuilderExt(); props.lastModified(lastModified).creationDate(creationDate).displayName(name).status(OK); props.isCollection(); PropStat found = props.build(); net.java.dev.webdav.jaxrs.xml.elements.Response childResponse; URI childUri = uriInfo.getRequestUriBuilder().path(name).build(); childResponse = new net.java.dev.webdav.jaxrs.xml.elements.Response(new HRef(childUri), null, null, null, found); responses.add(childResponse); } MultiStatus st = new MultiStatus( responses.toArray(new net.java.dev.webdav.jaxrs.xml.elements.Response[responses.size()])); return Response.status(207).entity(st).build(); } @DELETE public Response delete() { return Response.status(401).build(); } @COPY public Response copy() { return Response.status(401).build(); } @MOVE public Response move() { return Response.status(401).build(); } @PROPPATCH public Response proppatch() { return Response.status(401).build(); } @MKCOL public Response mkcol() { return Response.status(405).build(); } @HEAD public Response head() { return Response.status(404).build(); } @LOCK public Response lock(@Context UriInfo uriInfo) { Prop prop = new Prop(new LockDiscovery(new ActiveLock(LockScope.EXCLUSIVE, LockType.WRITE, Depth.ZERO, new Owner("Administrator"), new TimeOut(10000L), new LockToken(new HRef("urn:uuid:Administrator")), new LockRoot(new HRef(uriInfo.getRequestUri()))))); return Response.ok().entity(prop).header("Lock-Token", "urn:uuid:Administrator").build(); } @UNLOCK public Response unlock() { return Response.status(204).build(); } }